#include "Region.hpp"
map <int, RegionImage * > RegionImage::m_total;
int RegionImage::m_compteur=0;

RegionImage::RegionImage(Noeud * n, double moyenne):m_moyenne(moyenne){
    //incrementation de l'identifiant
    m_compteur++;
    m_id = m_compteur;
    liste.push_back(n);
}
void RegionImage::ajoute(const RegionImage& e2 ){
	int taille = liste.size();
	int taille2 = e2.getListe().size();
        //parcours de la deuxieme RegionImage
	for(int i= 0; i<taille2; i++){
            //ajout de chaque element
                e2[i]->setRegion(this);
		liste.push_back(e2[i]);
	}
        //calcul de la moyenne des deux regions
	double moyenne2 = e2.getMoyenne();
	m_moyenne = (m_moyenne * taille +e2.getListe().size()* moyenne2)/(taille +e2.getListe().size());
	
}
void RegionImage::vide(){
	liste.clear();
}
vector<Noeud*> RegionImage::getListe()const {
	return liste;
}

Noeud*  RegionImage::operator[] (int i)const{
	int taille = liste.size();
	assert(i<taille);
	assert(i>=0);
	return liste[i];
}
map <int, RegionImage * > *  RegionImage::getTotal(){
	return &m_total;
}
double RegionImage::getMoyenne() const{
	return m_moyenne;
}
void RegionImage::ajouteNoeud(Noeud * n, double moyenne){
         n->setRegion(this);
	int taille = liste.size();
	liste.push_back(n);
        //calcul de la moyenne
	m_moyenne = (m_moyenne*taille + moyenne)/(taille+1);
}
void RegionImage::afficheRegion(IplImage* im){
	int taille = liste.size();
	for(int i= 0; i<taille; i++){
		Noeud * n = (Noeud*) liste[i];
                n->afficheRegion(im, m_moyenne);
	}
}
void RegionImage::erase(int id){
        m_total.erase(id);
}
int RegionImage::getId(){
	return m_id;
}
void RegionImage::add(RegionImage * e){
	m_total[e->getId()]=e;
}
void RegionImage::fillImage(QImage & im){
    QRgb value;
    value = qRgb(rand()%255, rand()%255, rand()%255);
    int taille = liste.size();

    //parcours de tout les noeud de la region
    for(int i= 0; i<taille; i++){
            Noeud * n = (Noeud*) liste[i];
            n->fillImage(im, value);
    }
}
void RegionImage::detruit(){
    for(map<int,RegionImage *>::iterator i = m_total.begin() ; i!= m_total.end() ; i++){
            RegionImage  * e = (RegionImage *)(i->second);
           delete e;
    }
}
